<?php
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

require 'vendor/autoload.php';
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use PhpOffice\PhpSpreadsheet\Style\Alignment;
use PhpOffice\PhpSpreadsheet\Style\Border;
use PhpOffice\PhpSpreadsheet\Style\Fill;
use PhpOffice\PhpSpreadsheet\Chart\Chart;
use PhpOffice\PhpSpreadsheet\Chart\Legend;
use PhpOffice\PhpSpreadsheet\Chart\Title;
use PhpOffice\PhpSpreadsheet\Chart\PlotArea;
use PhpOffice\PhpSpreadsheet\Chart\Layout;
use PhpOffice\PhpSpreadsheet\Chart\DataSeries;
use PhpOffice\PhpSpreadsheet\Chart\DataSeriesValues;

ob_start();

require_once "../conexion/conexion.php";

// FUNCIÓN MEJORADA PARA CONVERTIR FECHAS
function convertirFecha($fecha) {
    if (empty($fecha)) {
        return '';
    }
    
    // Primero intentar con formato d/m/Y
    $fechaObj = DateTime::createFromFormat('d/m/Y', $fecha);
    if (!$fechaObj) {
        // Si falla, intentar con formato j/n/Y (sin ceros)
        $fechaObj = DateTime::createFromFormat('j/n/Y', $fecha);
    }
    
    if ($fechaObj) {
        return $fechaObj->format('Y-m-d');
    }
    
    error_log("Error al convertir fecha: $fecha");
    return '';
}

// FUNCIÓN PARA CONSTRUIR CONSULTA CON FILTROS
function construirConsulta($fechaInicio, $fechaFin) {
    $where = "WHERE 1";
    $parametros = [];
    
    $fechaInicioConvertida = convertirFecha($fechaInicio);
    $fechaFinConvertida = convertirFecha($fechaFin);
    
    if (!empty($fechaInicioConvertida) && !empty($fechaFinConvertida)) {
        $where .= " AND fecha >= :fechaInicio AND fecha <= :fechaFin";
        $parametros['fechaInicio'] = $fechaInicioConvertida;
        $parametros['fechaFin'] = $fechaFinConvertida;
        
        error_log("Filtro aplicado - Inicio: $fechaInicioConvertida, Fin: $fechaFinConvertida");
    } else {
        error_log("No se aplicó filtro de fechas");
    }
    
    return [$where, $parametros];
}

// Manejo de exportación a Excel
if (isset($_GET['export']) && $_GET['export'] === 'excel') {
    ob_end_clean();

    try {
        // Obtener parámetros de filtrado
        $fechaInicio = isset($_GET['fecha_inicio']) ? trim($_GET['fecha_inicio']) : '';
        $fechaFin = isset($_GET['fecha_fin']) ? trim($_GET['fecha_fin']) : '';
        
        error_log("Excel Export - Fecha inicio recibida: '$fechaInicio', Fecha fin recibida: '$fechaFin'");

        // Construir consulta
        list($where, $parametros) = construirConsulta($fechaInicio, $fechaFin);
        
        $sql = "SELECT id_registro, temperatura, fecha, hora 
                FROM registros_tempreatura 
                $where 
                ORDER BY fecha DESC, hora DESC";
        
        error_log("SQL Query: $sql");
        error_log("Parámetros: " . print_r($parametros, true));
        
        $stmt = $conexion->prepare($sql);
        
        // Enlazar parámetros
        foreach ($parametros as $key => $value) {
            $stmt->bindValue(":$key", $value, PDO::PARAM_STR);
            error_log("Parámetro enlazado: $key = $value");
        }
        
        $stmt->execute();

        // Verificar datos
        $rowCount = $stmt->rowCount();
        error_log("Registros encontrados: $rowCount");

        // Crear Excel
        $spreadsheet = new Spreadsheet();

        // === HOJA 1: Registros_Temperatura ===
        $sheet = $spreadsheet->getActiveSheet();
        $sheet->setTitle("Registros_Temperatura");

        // Encabezados
        $sheet->setCellValue('A1', 'No.');
        $sheet->setCellValue('B1', 'ID Registro');
        $sheet->setCellValue('C1', 'Temperatura (°C)');
        $sheet->setCellValue('D1', 'Fecha');
        $sheet->setCellValue('E1', 'Hora');
        $sheet->setCellValue('F1', 'Fecha y Hora');

        // Estilo de encabezados
        $headerStyle = [
            'font' => ['bold' => true, 'color' => ['rgb' => 'FFFFFF']],
            'fill' => ['fillType' => Fill::FILL_SOLID, 'color' => ['rgb' => '4472C4']],
            'borders' => ['allBorders' => ['borderStyle' => Border::BORDER_THIN, 'color' => ['rgb' => '000000']]],
            'alignment' => ['horizontal' => Alignment::HORIZONTAL_CENTER, 'vertical' => Alignment::VERTICAL_CENTER]
        ];
        $sheet->getStyle('A1:F1')->applyFromArray($headerStyle);

        // Ajustar anchos
        $sheet->getColumnDimension('A')->setWidth(8);
        $sheet->getColumnDimension('B')->setWidth(12);
        $sheet->getColumnDimension('C')->setWidth(18);
        $sheet->getColumnDimension('D')->setWidth(15);
        $sheet->getColumnDimension('E')->setWidth(12);
        $sheet->getColumnDimension('F')->setWidth(20);

        // Llenar datos
        $fila = 2;
        $contador = 1;
        $totalRegistros = 0;
        $tempPromedio = 0;
        $tempMaxima = -999;
        $tempMinima = 999;

        while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
            $sheet->setCellValue('A' . $fila, $contador++);
            $sheet->setCellValue('B' . $fila, $row['id_registro']);
            $sheet->setCellValue('C' . $fila, $row['temperatura']);
            $sheet->setCellValue('D' . $fila, $row['fecha']);
            $sheet->setCellValue('E' . $fila, $row['hora']);
            $sheet->setCellValue('F' . $fila, $row['fecha'] . ' ' . $row['hora']);

            $tempActual = floatval($row['temperatura']);
            $tempPromedio += $tempActual;
            $tempMaxima = max($tempMaxima, $tempActual);
            $tempMinima = min($tempMinima, $tempActual);
            $totalRegistros++;

            // Alternar colores de filas
            if ($fila % 2 == 0) {
                $sheet->getStyle("A$fila:F$fila")->getFill()
                    ->setFillType(Fill::FILL_SOLID)
                    ->getStartColor()->setRGB('F2F2F2');
            }

            $fila++;
        }

        // Si no hay registros
        if ($totalRegistros == 0) {
            $sheet->setCellValue('A2', 'No se encontraron registros para el período seleccionado');
            $sheet->mergeCells('A2:F2');
            $sheet->getStyle('A2')->getFont()->setBold(true)->getColor()->setRGB('FF0000');
            $sheet->getStyle('A2')->getAlignment()->setHorizontal(Alignment::HORIZONTAL_CENTER);
        } else {
            // Estadísticas
            $tempPromedio = $tempPromedio / $totalRegistros;

            $filaStats = $fila + 2;
            $sheet->setCellValue("A$filaStats", "ESTADÍSTICAS:");
            $sheet->getStyle("A$filaStats")->getFont()->setBold(true);
            $sheet->mergeCells("A$filaStats:C$filaStats");

            $filaStats++;
            $sheet->setCellValue("A$filaStats", "Total de Registros:");
            $sheet->setCellValue("B$filaStats", $totalRegistros);
            
            $filaStats++;
            $sheet->setCellValue("A$filaStats", "Temperatura Promedio:");
            $sheet->setCellValue("B$filaStats", number_format($tempPromedio, 2) . " °C");
            
            $filaStats++;
            $sheet->setCellValue("A$filaStats", "Temperatura Máxima:");
            $sheet->setCellValue("B$filaStats", $tempMaxima . " °C");
            
            $filaStats++;
            $sheet->setCellValue("A$filaStats", "Temperatura Mínima:");
            $sheet->setCellValue("B$filaStats", $tempMinima . " °C");
            
            if (!empty($parametros)) {
                $filaStats++;
                $sheet->setCellValue("A$filaStats", "Período:");
                $sheet->setCellValue("B$filaStats", "$fechaInicio a $fechaFin");
            }
            
            $filaStats++;
            $sheet->setCellValue("A$filaStats", "Fecha de Reporte:");
            $sheet->setCellValue("B$filaStats", date('d/m/Y H:i:s'));
        }

        // === HOJA 2: Grafica ===
        $graficaSheet = new \PhpOffice\PhpSpreadsheet\Worksheet\Worksheet($spreadsheet, "Grafica");
        $spreadsheet->addSheet($graficaSheet, 1);

        // Encabezados de la hoja de gráfica
        $graficaSheet->setCellValue("A1", "Fecha");
        $graficaSheet->setCellValue("B1", "Hora");
        $graficaSheet->setCellValue("C1", "Temperatura (°C)");
        $graficaSheet->getStyle("A1:C1")->getFont()->setBold(true);

        // Volver a ejecutar la consulta para llenar la hoja Grafica
        $stmt->execute();
        $filaGraf = 2;
        while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
            $graficaSheet->setCellValue("A".$filaGraf, $row['fecha']);
            $graficaSheet->setCellValue("B".$filaGraf, $row['hora']);
            $graficaSheet->setCellValue("C".$filaGraf, $row['temperatura']);
            $filaGraf++;
        }
        $lastRow = $filaGraf - 1;

        if ($lastRow > 1) {
            // Crear gráfico
            $xAxisTickValues = [
                new DataSeriesValues('String', "Grafica!A2:A$lastRow", null, $lastRow-1),
            ];
            $dataSeriesValues = [
                new DataSeriesValues('Number', "Grafica!C2:C$lastRow", null, $lastRow-1),
            ];

            $series = new DataSeries(
                DataSeries::TYPE_LINECHART,
                DataSeries::GROUPING_STANDARD,
                range(0, count($dataSeriesValues)-1),
                [],
                $xAxisTickValues,
                $dataSeriesValues
            );

            $layout = new Layout();
            $plotArea = new PlotArea($layout, [$series]);

            $chart = new Chart(
                'grafico_temperatura',
                new Title('Temperatura vs Tiempo'),
                new Legend(Legend::POSITION_BOTTOM, null, false),
                $plotArea,
                true,
                0,
                null,
                null
            );

            $chart->setTopLeftPosition('E2');
            $chart->setBottomRightPosition('N20');

            $graficaSheet->addChart($chart);
        }

        // Nombre del archivo
        $nombreArchivo = "RegistrosTemperatura";
        if (!empty($parametros)) {
            $fechaInicioSinBarras = str_replace('/', '_', $fechaInicio);
            $fechaFinSinBarras = str_replace('/', '_', $fechaFin);
            $nombreArchivo .= "_{$fechaInicioSinBarras}_a_{$fechaFinSinBarras}";
        }
        $nombreArchivo .= "_" . date('Y-m-d_H-i-s') . ".xlsx";

        error_log("Generando archivo: $nombreArchivo con $totalRegistros registros");

        // Headers para descarga
        header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
        header('Content-Disposition: attachment; filename="' . $nombreArchivo . '"');
        header('Cache-Control: max-age=0');
        header('Cache-Control: max-age=1');
        header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
        header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT');
        header('Cache-Control: cache, must-revalidate');
        header('Pragma: public');

        // Enviar archivo con gráficos
        $writer = new Xlsx($spreadsheet);
        $writer->setIncludeCharts(true);
        $writer->save('php://output');

        // Limpiar memoria
        $spreadsheet->disconnectWorksheets();
        unset($spreadsheet);

        error_log("Archivo Excel enviado correctamente");
        exit();
    } catch (Exception $e) {
        error_log("Error generando Excel: " . $e->getMessage());
        error_log("Stack trace: " . $e->getTraceAsString());
        if (!headers_sent()) {
            header('Content-Type: text/plain');
            echo "Error al generar el archivo Excel: " . $e->getMessage();
        }
        exit();
    }
}

// Manejo de vista previa POST
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    header('Content-Type: text/html; charset=utf-8');

    $fechaInicio = isset($_POST['fecha_inicio']) ? trim($_POST['fecha_inicio']) : '';
    $fechaFin = isset($_POST['fecha_fin']) ? trim($_POST['fecha_fin']) : '';

    error_log("Vista previa - Fecha inicio: '$fechaInicio', Fecha fin: '$fechaFin'");

    // Construir consulta
    list($where, $parametros) = construirConsulta($fechaInicio, $fechaFin);
    
    $sql = "SELECT id_registro, temperatura, fecha, hora 
            FROM registros_tempreatura 
            $where 
            ORDER BY fecha DESC, hora DESC 
            LIMIT 100"; // Límite para vista previa
    
    error_log("SQL Vista previa: $sql");
    error_log("Parámetros vista previa: " . print_r($parametros, true));
    
    $stmt = $conexion->prepare($sql);
    
    // Enlazar parámetros
    foreach ($parametros as $key => $value) {
        $stmt->bindValue(":$key", $value, PDO::PARAM_STR);
    }
    
    $stmt->execute();

    $rowCount = $stmt->rowCount();
    error_log("Registros encontrados para vista previa: $rowCount");

    $output = '<div class="table-responsive">';
    $output .= '<table class="table table-striped table-hover">';
    $output .= '<thead class="table-dark">';
    $output .= '<tr><th>No.</th><th>ID Registro</th><th>Temperatura (°C)</th><th>Fecha</th><th>Hora</th></tr>';
    $output .= '</thead><tbody>';

    $contador = 1;
    if ($rowCount > 0) {
        while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
            $output .= "<tr>";
            $output .= "<td><strong>$contador</strong></td>";
            $output .= "<td>{$row['id_registro']}</td>";
            $output .= "<td><span class='badge bg-info'>{$row['temperatura']}°C</span></td>";
            $output .= "<td>{$row['fecha']}</td>";
            $output .= "<td>{$row['hora']}</td>";
            $output .= "</tr>";
            $contador++;
        }
        
        $output .= '</tbody></table>';
        $output .= '<div class="alert alert-info mt-3">';
        $output .= "<strong>Registros encontrados:</strong> $rowCount (mostrando máximo 100)";
        if (!empty($parametros)) {
            $output .= "<br><strong>Período:</strong> $fechaInicio a $fechaFin";
        }
        $output .= '</div>';
    } else {
        $output .= '<tr><td colspan="5" class="text-center text-muted">';
        $output .= '<i class="fa fa-exclamation-triangle"></i> No se encontraron registros para el período seleccionado';
        if (!empty($parametros)) {
            $output .= "<br><small>Período consultado: $fechaInicio a $fechaFin</small>";
        }
        $output .= '</td></tr>';
        $output .= '</tbody></table>';
    }
    
    $output .= '</div>';
    echo $output;
    exit();
}

// Si llegamos aquí, no es ni export ni vista previa
error_log("Acceso sin parámetros válidos");
echo "Acceso no válido al script.";
?>
